home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 7
/
Amiga Format AFCD07 (Dec 1996, Issue 91).iso
/
serious
/
shareware
/
programming
/
aros
/
exec
/
makefunctions.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-12
|
3KB
|
113 lines
/*
(C) 1995-96 AROS - The Amiga Replacement OS
$Id: makefunctions.c,v 1.4 1996/08/13 13:56:03 digulla Exp $
$Log: makefunctions.c,v $
Revision 1.4 1996/08/13 13:56:03 digulla
Replaced __AROS_LA by __AROS_LHA
Replaced some __AROS_LH*I by __AROS_LH*
Sorted and added includes
Revision 1.3 1996/08/01 17:41:13 digulla
Added standard header for all files
Desc:
Lang: english
*/
#include <exec/execbase.h>
#include <aros/libcall.h>
#include "machine.h"
/*****************************************************************************
NAME */
#include <clib/exec_protos.h>
__AROS_LH3(ULONG, MakeFunctions,
/* SYNOPSIS */
__AROS_LHA(APTR, target, A0),
__AROS_LHA(APTR, functionArray, A1),
__AROS_LHA(APTR, funcDispBase, A2),
/* LOCATION */
struct ExecBase *, SysBase, 15, Exec)
/* FUNCTION
Creates the jumptable for a shared library and flushes the processor's
instruction cache. Does not checksum the library.
INPUTS
target - The highest byte +1 of the jumptable. Typically
this is the library's base address.
functionArray - Pointer to either an array of function pointers or
an array of WORD displacements to a given location
in memory. A value of -1 terminates the array in both
cases.
funcDispBase - The base location for WORD displacements or NULL
for function pointers.
RESULT
Size of the jumptable.
NOTES
EXAMPLE
BUGS
SEE ALSO
INTERNALS
HISTORY
******************************************************************************/
{
__AROS_FUNC_INIT
/* Cast for easier access */
struct JumpVec *jv=(struct JumpVec *)target;
if(funcDispBase!=NULL)
{
/* If FuncDispBase is non-NULL it's an array of relative offsets */
WORD *fp=(WORD *)functionArray;
/* -1 terminates the array */
while(*fp!=-1)
{
/* Decrement vector pointer by one and install vector */
jv--;
SET_JMP(jv);
SET_VEC(jv,(BYTE *)funcDispBase+*fp);
/* Use next array entry */
fp++;
}
}else
{
/* If FuncDispBase is NULL it's an array of function pointers */
void **fp=(void **)functionArray;
/* -1 terminates the array */
while(*fp!=(void *)-1)
{
/* Decrement vector pointer by one and install vector */
jv--;
SET_JMP(jv);
SET_VEC(jv,*fp);
/* Use next array entry */
fp++;
}
}
/* Clear instruction cache for the whole jumptable */
CacheClearE(jv,(BYTE *)funcDispBase-(BYTE *)jv,CACRF_ClearI);
/* Return size of jumptable */
return (BYTE *)funcDispBase-(BYTE *)jv;
__AROS_FUNC_EXIT
} /* MakeFunctions */